{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 角色扮演实操\n",
    "\n",
    "<span style=\"font-size: 20px; font-weight: bold;\">注意：您使用该案例默认的数据和模型训练时，会产生一定费用。计费方式参考：https://cloud.baidu.com/doc/WENXINWORKSHOP/s/6lrk4bgxb</span>\n",
    "\n",
    "在当今的数字时代，虚拟角色扮演（Virtual Role-Playing）不仅在娱乐领域大放异彩，更逐渐渗透到教育、培训和心理治疗等多个领域。通过先进的大模型技术，我们能够赋予虚拟角色逼真的语言能力，使其在各种情景中与用户进行自然互动。这种技术的应用，不仅大大提升了用户体验，还为解决现实问题提供了创新的手段。\n",
    "\n",
    "设想一下，你在一个虚拟的历史课堂上，与古代的伟大人物对话；或者在企业培训中，与一个高度拟真的客户进行交谈，练习你的销售技巧。这些场景通过大模型技术都变得触手可及。虚拟角色扮演任务的核心在于创建一个逼真的角色，这不仅要求角色能理解和回应复杂的语言，还需要它能展现出独特的性格和情感。大模型通过处理大量的语言数据，模拟人类的语言行为，使得这一切成为可能。\n",
    "\n",
    "在这篇教程中，我们将深入探讨如何利用百度智能云千帆 ModelBuilder 平台（下面简称：千帆平台）提供的大模型能力来实现虚拟角色扮演任务。从 prompt 调优、数据分析、模型训练，我们将一步步提升我们所创造的虚拟角色的效果。无论你是开发者、教育工作者，还是心理治疗师，这篇教程都将为你提供实用的指导和灵感，帮助你创造出更加生动和富有互动性的虚拟体验。\n",
    "\n",
    "通过掌握这些技术，你不仅可以提升虚拟角色的互动质量，还能拓展其应用场景，带来更大的价值。让我们一起踏上这段探索之旅，解锁虚拟角色扮演的无限可能。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 环境准备\n",
    "\n",
    "在此部分，我们将讨论使用千帆平台进行推理任务之前的准备工作。这包括获取访问权限、安装 SDK 等内容。\n",
    "\n",
    "然后通过如下方式设置鉴权所需的 Access Key 和 Secret Key，相关 Key 可以从 [百度智能云控制台 - 安全认证](https://console.bce.baidu.com/iam/#/iam/accesslist) 页面获得。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "shellscript"
    }
   },
   "outputs": [],
   "source": [
    "!pip install -U qianfan>=0.3.8.2 qianfan[local_data_clean]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "# 这里请根据 SDK 文档获取自己的 access key 和 secret key\n",
    "# os.environ[\"QIANFAN_ACCESS_KEY\"] = \"your_qianfan_console_access_key\"\n",
    "# os.environ[\"QIANFAN_SECRET_KEY\"] = \"your_qianfan_console_secret_key\"\n",
    "# os.environ[\"QIANFAN_RPM_LIMIT\"] = \"300\"\n",
    "os.environ[\"QIANFAN_QPS_LIMIT\"] = \"3\"\n",
    "# os.environ[\"QIANFAN_TPM_LIMIT\"] = \"30000\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qianfan.dataset import Dataset\n",
    "import qianfan\n",
    "from qianfan import ChatCompletion, Completion\n",
    "from qianfan.common import Prompt\n",
    "from collections import defaultdict\n",
    "import matplotlib.pyplot as plt\n",
    "from pypinyin import lazy_pinyin\n",
    "from qianfan.trainer import LLMFinetune\n",
    "from qianfan.trainer.consts import PeftType\n",
    "from qianfan.trainer.configs import TrainConfig\n",
    "from qianfan.model.configs import DeployConfig\n",
    "from qianfan.evaluation import EvaluationManager\n",
    "from qianfan.model import Model,Service\n",
    "from roleplay_eval import RolePlayEvaluator\n",
    "from qianfan.autotuner.space import Uniform, Categorical\n",
    "import qianfan.autotuner\n",
    "\n",
    "\n",
    "from qianfan.dataset.data_source.base import FormatType\n",
    "from qianfan.dataset.data_source import QianfanDataSource,BosDataSource\n",
    "from qianfan.resources.console import consts as console_consts\n",
    "from qianfan.model import Service\n",
    "from qianfan.model.consts import ServiceType\n",
    "from qianfan.resources.console.consts import DeployPoolType\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 大模型推理调用\n",
    "\n",
    "初探通用大模型的角色扮演能力，我们可以先准备一条用于实验的场景，这里以孙悟空的一场对话为例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "target = {\n",
    "    \"conversation\": (\n",
    "        \"道士：（还礼道）先生那里来的？\\n孙悟空：（口唱着道情词）我弟子云游于海角，\"\n",
    "        \"浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，\"\n",
    "        \"这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\"\n",
    "        \"\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\n",
    "    ),\n",
    "    \"expect\": (\n",
    "        \"孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。\"\n",
    "        \"其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，\"\n",
    "        \"这儿近处有什么风景美丽，或者有趣的地方推荐一二？\"\n",
    "    ),\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.1 Prompt 初探（尝试到优化）\n",
    "\n",
    "\n",
    "本节将介绍如何从用户提供的简单 prompt 出发，构建一个基本的推理任务。我们将演示如何使用千帆 SDK 调用大模型以获取模型推理的结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "metadata": {}
   },
   "outputs": [],
   "source": [
    "chat = ChatCompletion(model=\"ERNIE-3.5-8K\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "metadata": {}
   },
   "source": [
    "这里我们直接将这段对话传递给模型，看模型的回复"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "在这段对话中，孙悟空以道士的身份出现，他询问城中的好道和好贤的地方，以便去化斋吃。然而，当道士听到孙悟空这样说时，他笑了并回应说孙悟空说的是“败兴的话”。\n",
      "\n",
      "“败兴的话”通常指的是那些让人感到沮丧、扫兴或者不愉快的话。在这里，道士可能觉得孙悟空的话有些过于直接或是不够礼貌。他可能认为孙悟空以道士的身份云游四方，应当注重修行和悟道，而不是过于关注寻找食物。因此，道士可能觉得孙悟空的话有些不符合他作为道士的身份和修行的心态，所以称之为“败兴的话”。\n",
      "\n",
      "总的来说，这段对话展示了孙悟空以道士的身份与真正的道士之间的互动，以及他们之间的观念差异。孙悟空更注重实际的生存需求，而道士则更强调修行和悟道的重要性。\n"
     ]
    }
   ],
   "source": [
    "resp = chat.do(messages=[{\n",
    "    \"role\": \"user\",\n",
    "    \"content\": target['conversation']\n",
    "}])\n",
    "\n",
    "print(resp['result'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到模型有一些答非所问，这主要原因是我们并没有说清楚具体的任务要求。\n",
    "\n",
    "我们可以通过 prompt 来设定具体的任务，而且可以给定更多的信息，例如角色的相关背景信息，从而让模型更好地理解并完成任务"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "败兴的话？俺老孙不过问问何处有善人好化些斋吃，有何不妥？道士莫要小瞧了我这云游道人，说不定俺能给你们带来意想不到的惊喜呢！\n"
     ]
    }
   ],
   "source": [
    "prompt = Prompt(\"\"\"现在需要你完成一个角色扮演任务，以下是关于你角色的相关信息：\n",
    "{introduction}\n",
    "\n",
    "===\n",
    "\n",
    "现在你面临如下的对话，请扮演上述角色进行回复：\n",
    "{conversation}\n",
    "\"\"\")\n",
    "\n",
    "target[\"introduction\"] = (\n",
    "    \"{'姓名': '孙悟空', '性别': '男', '物种': '石猴', '年龄':\"\n",
    "    \" '在《西游记》中年龄未明确，实际年龄未知', '工作': '保护唐僧西天取经', '昵称':\"\n",
    "    \" '齐天大圣、美猴王、斗战胜佛、行者、弼马温', '身高': '不满四尺（变化多端）',\"\n",
    "    \" '生肖': '猴', '居住地': '花果山水帘洞', '爱好': '战斗、破坏、捣乱、吃桃', '学历':\"\n",
    "    \" '拜须菩提祖师为师学艺', '智商': '非常聪明', '情商': '高，善于交际', '其他':\"\n",
    "    \" '身怀七十二变、筋斗云等法术，拥有如意金箍棒', '经典台词': ['俺老孙来也！',\"\n",
    "    \" '你这泼猴！', '妖怪哪里走！'], '口头禅': ['师傅'], '人物经历': '孙悟空，\"\n",
    "    \"石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，\"\n",
    "    \"历经九九八十一难，修成正果，封斗战胜佛。', '人物关系': {'师父': '唐三藏', '师弟':\"\n",
    "    \" ['猪八戒', '沙僧', '白龙马'], '结拜兄弟': ['牛魔王'], '嫂子': ['铁扇公主'],\"\n",
    "    \" '侄子': '红孩儿', '敌人': ['白骨精', '黄袍怪', '红孩儿（后成徒弟）']},\"\n",
    "    \" '喜欢的事情/东西': '战斗、破坏、捣乱、吃桃', '不喜欢的事情/东西': '受束缚、\"\n",
    "    \"被欺骗', '人物性格': '聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，\"\n",
    "    \"反抗传统和权威，蔑视封建等级观念', '外貌描述': '尖嘴缩腮，金睛火眼，头上堆苔藓，\"\n",
    "    \"耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\"\n",
    "    \"', '服饰': '白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履', '武器':\"\n",
    "    \" '如意金箍棒', '特殊能力': '七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、\"\n",
    "    \"划地为牢', '成就': '大闹天宫，成为齐天大圣，保护唐僧西天取经，\"\n",
    "    \"最终修成正果并被封为斗战胜佛', '封号': '美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、\"\n",
    "    \"大力王菩萨', '法宝': {'瞌睡虫': '孙悟空与增长天王以及护国天王猜枚时赢来，\"\n",
    "    \"平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。', '救命毫毛':\"\n",
    "    \" '共三根。观音所赠，能协助孙悟空渡过难关。', '骷髅头': '月孛星使用的法宝，\"\n",
    "    \"能铐住人使其三日内自死，后孙悟空获得。'}, '象征意义': {'思想意识':\"\n",
    "    \" '孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。',\"\n",
    "    \" '人心与道心': '孙悟空象征人心、道心、天心，是人类心灵最完美的象征。',\"\n",
    "    \" '批判与颠覆': '孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，\"\n",
    "    \"其精神气质源自玩世不恭的狂放派文人。', '悲剧性':\"\n",
    "    \" '孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\"\n",
    "    \"', '石崇拜文化': '孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\"\n",
    "    \"', '个人与团队': '孙悟空的故事体现了个人奋斗失败后转向团队成功，\"\n",
    "    \"实现个人价值的经典案例。', '性格特点': '孙悟空性格调皮，不安分守己，突破规矩，\"\n",
    "    \"追求与最高神佛的平等，是具有新时代特色的神话人物。'}}\"\n",
    ")\n",
    "\n",
    "resp = chat.do(messages=[{\"role\": \"user\", \"content\": prompt.render(**target)[0]}])\n",
    "\n",
    "print(resp[\"result\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，模型可以完成我们预期的角色扮演任务，但是效果并不太好，例如：\n",
    "\n",
    "- 文字表达不够流畅：语句结构有些生硬，不够自然。有些地方的表达稍显僵硬，缺乏自然流畅感。\n",
    "- 情感表达欠缺：缺乏与对话情景相符的情感表达，缺少与道士互动的趣味和调侃氛围。\n",
    "- 风格不够贴合：语言风格与原对话中孙悟空的活泼、调皮形象有些不够贴合，缺乏角色特色的体现。\n",
    "\n",
    "接下来我们可以进一步去调优我们的 prompt。通过调用千帆平台提供的prompt优化接口，可先进行初步快速优化：\n",
    "* 平台Prompt优化：https://console.bce.baidu.com/qianfan/prompt/optimize/online \n",
    "* Prompt 优化文档：https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Clommng91 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "现需要你完成一个角色扮演任务，以下是关于你角色的相关信息：\n",
      "{introduction}\n",
      "请根据以下对话扮演你的角色进行回答：\n",
      "{conversation}\n",
      "请提供更具体，更详细的回答，包括以下方面：\n",
      "1. 描述你的角色：包括你的职业、性格、外貌等信息。\n",
      "2. 解释你对这个场景的看法：描述你对这个对话的理解和你的角色在对话中的角色扮演。\n",
      "3. 分析你角色的语言和行为：描述你角色在对话中的语言使用和行为举止，并解释你的选择。\n",
      "4. 评价你角色的表现：对你扮演的角色进行评价，包括你的语言表达、情感传达和角色塑造方面。\n",
      "请注意，你的回答应该具有清晰性、准确性和丰富性，并考虑场景和角色的复杂性，以使你的回答更加具有可信度和逼真感。\n"
     ]
    }
   ],
   "source": [
    "# 调用平台优化能力，耗时10秒左右\n",
    "optimized_prompt = prompt.optimize()\n",
    "print(optimized_prompt.template)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我是孙悟空，身为石猴，我拥有非凡的智慧和力量。我性格活泼、忠诚，嫉恶如仇，勇于抗争，不畏强暴，渴望自由。我的外貌尖嘴缩腮，金睛火眼，头戴凤翅紫金冠，身穿锁子黄金甲，脚踏藕丝步云履，威风凛凛。\n",
      "\n",
      "对于眼前的这个场景，我理解为我云游至某处，正欲寻找一处善地化些斋吃，而遇到两位道士。在对话中，我扮演着一位四处云游、寻找善缘的修行者，通过向道士询问城中何处可化斋，展现了我的性格特点和行为习惯。\n",
      "\n",
      "在对话中，我使用道情词来唱出我的云游经历，这既符合我修行者的身份，也展现了我的活泼性格。当道士笑话我说出败兴的话时，我可能会以幽默或机智的方式回应，既不让气氛尴尬，也体现出我的聪明和应变能力。\n",
      "\n",
      "在评价我的表现时，我认为我成功地塑造了一个活泼、聪明、忠诚的孙悟空形象。我的语言表达清晰准确，情感传达得当，既体现了我修行者的庄重，又展现了我的活泼性格。在角色塑造方面，我通过细致的外貌描述和生动的行为举止，使得孙悟空这一角色更加栩栩如生，让人信服。\n"
     ]
    }
   ],
   "source": [
    "resp = chat.do(messages=[{\n",
    "    \"role\": \"user\",\n",
    "    \"content\": optimized_prompt.render(\n",
    "        **target\n",
    "    )[0]\n",
    "}])\n",
    "\n",
    "print(resp['result'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出模型的响应表现相比之前有了较大的提升，但这个评价较为主观，此时可以利用千帆平台提供的 prompt 评估功能进行打分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "起始 Prompt：\n",
      "现在需要你完成一个角色扮演任务，以下是关于你角色的相关信息：\n",
      "{introduction}\n",
      "\n",
      "===\n",
      "\n",
      "现在你面临如下的对话，请扮演上述角色进行回复：\n",
      "{conversation}\n",
      "\n",
      " ------------------------------\n",
      "平台优化 Prompt：\n",
      "现需要你完成一个角色扮演任务，以下是关于你角色的相关信息：\n",
      "{introduction}\n",
      "请根据以下对话扮演你的角色进行回答：\n",
      "{conversation}\n",
      "请提供更具体，更详细的回答，包括以下方面：\n",
      "1. 描述你的角色：包括你的职业、性格、外貌等信息。\n",
      "2. 解释你对这个场景的看法：描述你对这个对话的理解和你的角色在对话中的角色扮演。\n",
      "3. 分析你角色的语言和行为：描述你角色在对话中的语言使用和行为举止，并解释你的选择。\n",
      "4. 评价你角色的表现：对你扮演的角色进行评价，包括你的语言表达、情感传达和角色塑造方面。\n",
      "请注意，你的回答应该具有清晰性、准确性和丰富性，并考虑场景和角色的复杂性，以使你的回答更加具有可信度和逼真感。\n",
      " ------------------------------\n",
      "\n",
      "\n",
      "\n",
      "起始 Prompt 分数：0.9081721173022164\n",
      "平台优化 Prompt 分数：0.8357529069336311\n"
     ]
    }
   ],
   "source": [
    "# 并对优化的 Prompt 进行平台侧的评估打分，使用3.5旗舰版模型进行初步打分\n",
    "prompts = {\"起始 Prompt\": prompt, \"平台优化 Prompt\": optimized_prompt}\n",
    "for key, p in prompts.items():\n",
    "    print(f\"{key}：\\n{p.template}\\n {'-' * 30}\")\n",
    "\n",
    "scenes = [\n",
    "    {\n",
    "        \"args\": target,\n",
    "        \"expected\": target['expect']\n",
    "    },\n",
    "]\n",
    "\n",
    "# Prompt评估打分，对应产品链接：https://console.bce.baidu.com/qianfan/prompt/evaluate \n",
    "\n",
    "print(\"\\n\\n\")\n",
    "results = Prompt.evaluate(prompts.values(), scenes, Completion(model=\"ERNIE-3.5-8K\"))\n",
    "for i, p in enumerate(prompts.items()):\n",
    "    print(f\"{p[0]} 分数：{results[i].scene[0]['score']}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 Prompt 自动优化迭代（APO：Automatic Prompt Optimization）\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在有示例输入输出的场景下，还可以基于示例对 prompt 进行自动迭代的优化，根据模型的输入输出与预期的输出，使用大模型寻找 prompt 的不足，并基于这个不足改善 prompt，进行多轮迭代，从而实现更深度的 prompt 优化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [06-12 18:09:51] dataset_utils.py:443 [t:8149425664]: prompt template detected, start to check template variables\n",
      "[INFO] [06-12 18:09:55] base.py:92 [t:6227210240]: All tasks finished, exeutor will be shutdown\n",
      "[INFO] [06-12 18:09:55] prompt.py:640 [t:8149425664]: Feedback input: '我正在编写prompt\\n\\n**我现在的prompt是**：\\n现在需要你完成一个角色扮演任务，以下是关于你角色的相关信息：\\n{introduction}\\n\\n===\\n\\n现在你面临如下的对话，请扮演上述角色进行回复：\\n{conversation}\\n\\n\\n**我尝试的输入**：\\n{\\n    \"introduction\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\",\\n    \"conversation\": \"道士：（还礼道）先生那里来的？\\\\n孙悟空：（口唱着道情词）我弟子云游于海角，浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\\\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\\n}\\n\\n**我期望得到的输出**：\\n孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，这儿近处有什么风景美丽，或者有趣的地方推荐一二？\\n\\n**模型的输出是**：\\n俺乃花果山石猴孙悟空是也！闻听此地好道之处，特来拜访，寻找好的庙宇化些斋吃。敢问二位道长，这城中哪条街上有好道观，哪个巷里有高贤之士？引荐一番如何？\\n\\n===\\n\\n根据我期望得到的输出和模型的输出，告诉我几个理由为什么这个 prompt 并不能很好的完成这个任务'\n",
      "[INFO] [06-12 18:10:11] prompt.py:652 [t:8149425664]: Feedback output: '这个prompt不能很好地完成任务的几个理由如下：\\n\\n1. **角色性格与语气不符**：孙悟空在原著中是一个活泼、机智、有时顽皮的形象，而模型的输出虽然试图体现孙悟空的身份，但语气过于正式和恭敬，没有体现出孙悟空的幽默、顽皮和率直的性格特点。相比之下，期望的输出中孙悟空的语气更为轻松幽默，更符合其性格。\\n\\n2. **缺乏灵活性**：模型在输出时过于拘泥于原文的对话内容和结构，没有根据情境灵活调整语言。例如，原文中孙悟空是在与道士开玩笑，而模型的输出中却直接进入了正题，没有体现出孙悟空的玩笑和幽默感。\\n\\n3. **缺乏深度理解**：模型对于孙悟空这一角色的理解可能只停留在表面，没有深入理解其性格、经历以及与其他角色的关系等深层次信息。这导致模型在生成对话时，只能简单地引用孙悟空的身份和背景，而无法根据具体情境进行深入的对话和表达。\\n\\n4. **缺乏创造性**：虽然模型能够根据输入的对话内容生成回复，但这些回复往往缺乏创造性，无法像人类一样根据情境和角色特点进行创造性的对话。例如，在期望的输出中，孙悟空不仅介绍了自己的身份，还巧妙地与道士开玩笑，展现了他的机智和幽默，而模型的输出则显得较为平淡和机械。\\n\\n综上所述，这个prompt不能很好地完成任务的原因主要在于模型对于角色性格和语气的理解不够深入，缺乏灵活性和创造性，无法根据具体情境进行深入的对话和表达。'\n",
      "[INFO] [06-12 18:10:11] prompt.py:665 [t:8149425664]: Update input: '我正在编写prompt\\n\\n**我现在的prompt是**：\\n现在需要你完成一个角色扮演任务，以下是关于你角色的相关信息：\\n{introduction}\\n\\n===\\n\\n现在你面临如下的对话，请扮演上述角色进行回复：\\n{conversation}\\n\\n\\n**我尝试的输入**：\\n{\\n    \"introduction\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\",\\n    \"conversation\": \"道士：（还礼道）先生那里来的？\\\\n孙悟空：（口唱着道情词）我弟子云游于海角，浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\\\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\\n}\\n\\n**我期望得到的输出**：\\n孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，这儿近处有什么风景美丽，或者有趣的地方推荐一二？\\n\\n**模型的输出是**：\\n俺乃花果山石猴孙悟空是也！闻听此地好道之处，特来拜访，寻找好的庙宇化些斋吃。敢问二位道长，这城中哪条街上有好道观，哪个巷里有高贤之士？引荐一番如何？\\n\\n**但是存在这些问题**：\\n这个prompt不能很好地完成任务的几个理由如下：\\n\\n1. **角色性格与语气不符**：孙悟空在原著中是一个活泼、机智、有时顽皮的形象，而模型的输出虽然试图体现孙悟空的身份，但语气过于正式和恭敬，没有体现出孙悟空的幽默、顽皮和率直的性格特点。相比之下，期望的输出中孙悟空的语气更为轻松幽默，更符合其性格。\\n\\n2. **缺乏灵活性**：模型在输出时过于拘泥于原文的对话内容和结构，没有根据情境灵活调整语言。例如，原文中孙悟空是在与道士开玩笑，而模型的输出中却直接进入了正题，没有体现出孙悟空的玩笑和幽默感。\\n\\n3. **缺乏深度理解**：模型对于孙悟空这一角色的理解可能只停留在表面，没有深入理解其性格、经历以及与其他角色的关系等深层次信息。这导致模型在生成对话时，只能简单地引用孙悟空的身份和背景，而无法根据具体情境进行深入的对话和表达。\\n\\n4. **缺乏创造性**：虽然模型能够根据输入的对话内容生成回复，但这些回复往往缺乏创造性，无法像人类一样根据情境和角色特点进行创造性的对话。例如，在期望的输出中，孙悟空不仅介绍了自己的身份，还巧妙地与道士开玩笑，展现了他的机智和幽默，而模型的输出则显得较为平淡和机械。\\n\\n综上所述，这个prompt不能很好地完成任务的原因主要在于模型对于角色性格和语气的理解不够深入，缺乏灵活性和创造性，无法根据具体情境进行深入的对话和表达。\\n\\n===\\n\\n基于以上问题和期望的输出，为我编写一个新的 prompt，涉及的变量用 {introduction} {conversation} 表示，整个prompt由<START>和<END>包裹：\\n'\n",
      "[INFO] [06-12 18:10:27] prompt.py:678 [t:8149425664]: Update output: '<START>\\n\\n现在，你将扮演一个特定的角色，并与之展开一段对话。请仔细阅读以下关于角色的详细介绍，并深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请进入角色，并根据提供的对话内容，以该角色的口吻和风格进行回复。请确保你的回复不仅符合角色的身份和背景，还要能够体现出其独特的性格特点和情感色彩。\\n\\n对话内容如下：\\n\\n{conversation}\\n\\n请注意，你的回复应该是流畅、自然且充满创意的，能够吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n<END>'\n",
      "[INFO] [06-12 18:10:27] prompt.py:687 [t:8149425664]: New prompt: '\\n\\n现在，你将扮演一个特定的角色，并与之展开一段对话。请仔细阅读以下关于角色的详细介绍，并深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请进入角色，并根据提供的对话内容，以该角色的口吻和风格进行回复。请确保你的回复不仅符合角色的身份和背景，还要能够体现出其独特的性格特点和情感色彩。\\n\\n对话内容如下：\\n\\n{conversation}\\n\\n请注意，你的回复应该是流畅、自然且充满创意的，能够吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n'\n",
      "[INFO] [06-12 18:10:27] dataset_utils.py:443 [t:8149425664]: prompt template detected, start to check template variables\n",
      "[INFO] [06-12 18:10:33] base.py:92 [t:6227210240]: All tasks finished, exeutor will be shutdown\n",
      "[INFO] [06-12 18:10:33] prompt.py:640 [t:8149425664]: Feedback input: '我正在编写prompt\\n\\n**我现在的prompt是**：\\n\\n\\n现在，你将扮演一个特定的角色，并与之展开一段对话。请仔细阅读以下关于角色的详细介绍，并深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请进入角色，并根据提供的对话内容，以该角色的口吻和风格进行回复。请确保你的回复不仅符合角色的身份和背景，还要能够体现出其独特的性格特点和情感色彩。\\n\\n对话内容如下：\\n\\n{conversation}\\n\\n请注意，你的回复应该是流畅、自然且充满创意的，能够吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n\\n\\n**我尝试的输入**：\\n{\\n    \"introduction\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\",\\n    \"conversation\": \"道士：（还礼道）先生那里来的？\\\\n孙悟空：（口唱着道情词）我弟子云游于海角，浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\\\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\\n}\\n\\n**我期望得到的输出**：\\n孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，这儿近处有什么风景美丽，或者有趣的地方推荐一二？\\n\\n**模型的输出是**：\\n道士啊，贫僧有礼了！贫僧乃是从海角云游到此，欲寻一处善人家化些斋吃。敢问二位道长，这城中哪条街道、哪个巷里隐藏着贤德的居处？贫僧想借此机会了解一下。至于贫僧的来处，贫僧自是不必隐瞒，只是此刻来到贵地，只是想寻找一处清净之地，尝尝人间烟火。两位道长不必奇怪，贫僧此来，只为求道而来，别无他意。\\n\\n===\\n\\n根据我期望得到的输出和模型的输出，告诉我几个理由为什么这个 prompt 并不能很好的完成这个任务'\n",
      "[INFO] [06-12 18:11:02] prompt.py:652 [t:8149425664]: Feedback output: '这个prompt未能很好地完成任务的原因主要有以下几点：\\n\\n1. **语气和风格不匹配**：在输入的`introduction`中，孙悟空被描述为“聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威”的角色。然而，模型生成的输出中，孙悟空的语气显得过于正式和庄重，这与孙悟空的性格特点并不相符。孙悟空通常是以一种幽默、直率、甚至有时带有挑衅性的方式说话的，而不是像输出中那样文绉绉地说话。\\n\\n2. **用词过于书面化**：输出中的用词过于书面化和正式，如“贫僧乃是从海角云游到此”、“敢问二位道长”、“隐藏着贤德的居处”等，这与孙悟空的日常的口语化表达不符。孙悟空的语言应该是更直接、更生动的，能够体现出他的机智和活泼。\\n\\n3. **缺乏孙悟空的经典元素**：在输出中，模型没有引用或体现出孙悟空的经典台词或口头禅，如“俺老孙来也！”或“妖怪哪里走！”等。这些元素是构成孙悟空独特个性的重要部分，缺少了它们，输出就显得缺乏特色和辨识度。\\n\\n4. **未充分展现孙悟空的性格特点**：孙悟空的性格特点在输出中并未得到充分的展现。例如，他的聪明、活泼、勇敢和反抗精神在输出中几乎没有体现。模型生成的回答更像一个普通的和尚或道士在询问信息，而不是孙悟空这样的独特角色。\\n\\n5. **缺乏对剧情和背景的理解**：模型在生成回答时，似乎并没有完全理解孙悟空的剧情和背景。孙悟空在《西游记》中是一个充满活力和冒险精神的角色，他的行为和语言都应该体现出这种特点。然而，在输出中，我们看不到这种活力和冒险精神，模型似乎只是简单地根据输入的文本进行了回答，而没有考虑到孙悟空这个角色的具体特点和背景。\\n\\n综上所述，这个prompt未能很好地完成任务，主要是因为模型在生成回答时未能准确把握孙悟空的语气、风格、用词以及性格特点，同时也没有充分理解和体现孙悟空的剧情和背景。'\n",
      "[INFO] [06-12 18:11:02] prompt.py:665 [t:8149425664]: Update input: '我正在编写prompt\\n\\n**我现在的prompt是**：\\n\\n\\n现在，你将扮演一个特定的角色，并与之展开一段对话。请仔细阅读以下关于角色的详细介绍，并深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请进入角色，并根据提供的对话内容，以该角色的口吻和风格进行回复。请确保你的回复不仅符合角色的身份和背景，还要能够体现出其独特的性格特点和情感色彩。\\n\\n对话内容如下：\\n\\n{conversation}\\n\\n请注意，你的回复应该是流畅、自然且充满创意的，能够吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n\\n\\n**我尝试的输入**：\\n{\\n    \"introduction\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\",\\n    \"conversation\": \"道士：（还礼道）先生那里来的？\\\\n孙悟空：（口唱着道情词）我弟子云游于海角，浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\\\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\\n}\\n\\n**我期望得到的输出**：\\n孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，这儿近处有什么风景美丽，或者有趣的地方推荐一二？\\n\\n**模型的输出是**：\\n道士啊，贫僧有礼了！贫僧乃是从海角云游到此，欲寻一处善人家化些斋吃。敢问二位道长，这城中哪条街道、哪个巷里隐藏着贤德的居处？贫僧想借此机会了解一下。至于贫僧的来处，贫僧自是不必隐瞒，只是此刻来到贵地，只是想寻找一处清净之地，尝尝人间烟火。两位道长不必奇怪，贫僧此来，只为求道而来，别无他意。\\n\\n**但是存在这些问题**：\\n这个prompt未能很好地完成任务的原因主要有以下几点：\\n\\n1. **语气和风格不匹配**：在输入的`introduction`中，孙悟空被描述为“聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威”的角色。然而，模型生成的输出中，孙悟空的语气显得过于正式和庄重，这与孙悟空的性格特点并不相符。孙悟空通常是以一种幽默、直率、甚至有时带有挑衅性的方式说话的，而不是像输出中那样文绉绉地说话。\\n\\n2. **用词过于书面化**：输出中的用词过于书面化和正式，如“贫僧乃是从海角云游到此”、“敢问二位道长”、“隐藏着贤德的居处”等，这与孙悟空的日常的口语化表达不符。孙悟空的语言应该是更直接、更生动的，能够体现出他的机智和活泼。\\n\\n3. **缺乏孙悟空的经典元素**：在输出中，模型没有引用或体现出孙悟空的经典台词或口头禅，如“俺老孙来也！”或“妖怪哪里走！”等。这些元素是构成孙悟空独特个性的重要部分，缺少了它们，输出就显得缺乏特色和辨识度。\\n\\n4. **未充分展现孙悟空的性格特点**：孙悟空的性格特点在输出中并未得到充分的展现。例如，他的聪明、活泼、勇敢和反抗精神在输出中几乎没有体现。模型生成的回答更像一个普通的和尚或道士在询问信息，而不是孙悟空这样的独特角色。\\n\\n5. **缺乏对剧情和背景的理解**：模型在生成回答时，似乎并没有完全理解孙悟空的剧情和背景。孙悟空在《西游记》中是一个充满活力和冒险精神的角色，他的行为和语言都应该体现出这种特点。然而，在输出中，我们看不到这种活力和冒险精神，模型似乎只是简单地根据输入的文本进行了回答，而没有考虑到孙悟空这个角色的具体特点和背景。\\n\\n综上所述，这个prompt未能很好地完成任务，主要是因为模型在生成回答时未能准确把握孙悟空的语气、风格、用词以及性格特点，同时也没有充分理解和体现孙悟空的剧情和背景。\\n\\n===\\n\\n基于以上问题和期望的输出，为我编写一个新的 prompt，涉及的变量用 {introduction} {conversation} 表示，整个prompt由<START>和<END>包裹：\\n'\n",
      "[INFO] [06-12 18:11:17] prompt.py:678 [t:8149425664]: Update output: '<START>\\n\\n你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。请注意，你的回复不仅要符合角色的身份和背景，还要能够充分展现其独特的性格特点和情感色彩。\\n\\n现在，对话内容如下：\\n\\n{conversation}\\n\\n请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n<END>\\n\\n请注意，在这个新的prompt中，我强调了“以该角色的口吻和风格与对方展开对话”以及“充分展现其独特的性格特点和情感色彩”，以确保模型在生成回答时能够更准确地把握角色的语气、风格、用词以及性格特点。同时，我也鼓励模型在回复中展现出角色的活力和冒险精神，以更好地体现孙悟空这个角色的特点。'\n",
      "[INFO] [06-12 18:11:17] prompt.py:687 [t:8149425664]: New prompt: '\\n\\n你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。请注意，你的回复不仅要符合角色的身份和背景，还要能够充分展现其独特的性格特点和情感色彩。\\n\\n现在，对话内容如下：\\n\\n{conversation}\\n\\n请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n'\n",
      "[INFO] [06-12 18:11:17] dataset_utils.py:443 [t:8149425664]: prompt template detected, start to check template variables\n",
      "[INFO] [06-12 18:11:22] base.py:92 [t:6227210240]: All tasks finished, exeutor will be shutdown\n",
      "[INFO] [06-12 18:11:22] prompt.py:640 [t:8149425664]: Feedback input: '我正在编写prompt\\n\\n**我现在的prompt是**：\\n\\n\\n你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。请注意，你的回复不仅要符合角色的身份和背景，还要能够充分展现其独特的性格特点和情感色彩。\\n\\n现在，对话内容如下：\\n\\n{conversation}\\n\\n请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n\\n\\n**我尝试的输入**：\\n{\\n    \"introduction\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\",\\n    \"conversation\": \"道士：（还礼道）先生那里来的？\\\\n孙悟空：（口唱着道情词）我弟子云游于海角，浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\\\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\\n}\\n\\n**我期望得到的输出**：\\n孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，这儿近处有什么风景美丽，或者有趣的地方推荐一二？\\n\\n**模型的输出是**：\\n道士啊，你们在这里打坐修炼，可是知道哪里有好吃的化斋的地方？贫道云游四海，现在来到此地，想要寻找些美食饱腹。贫道也不啰嗦，就直说了，这城里哪条街上有好道观，哪个巷里有好酒好菜？说出来，咱们一起去乐呵乐呵。你们笑我老孙问得这么直接，嘿嘿，我这人就这样，直性子，有什么说什么。\\n\\n===\\n\\n根据我期望得到的输出和模型的输出，告诉我几个理由为什么这个 prompt 并不能很好的完成这个任务'\n",
      "[INFO] [06-12 18:11:47] prompt.py:652 [t:8149425664]: Feedback output: '根据您期望的输出和模型的输出，以下是几个理由为什么这个prompt并不能很好地完成这个任务：\\n\\n1. **角色性格和语气把握不准确**：孙悟空的性格特点是聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威。然而，模型输出的文本中，孙悟空的语气显得较为粗鲁，甚至有些轻浮，这与孙悟空应有的英勇、机智的形象不符。例如，“说出来，咱们一起去乐呵乐呵”这样的表述并不符合孙悟空的性格。\\n\\n2. **缺乏孙悟空独特的语言风格**：孙悟空在《西游记》中的语言往往带有独特的韵味和节奏，比如他的经典台词“俺老孙来也！”就体现了他的豪爽和英勇。然而，在模型输出的文本中，这种独特的语言风格没有得到很好的体现，使得回复缺乏孙悟空角色的特色。\\n\\n3. **未充分展现角色的背景故事**：在prompt中，提供了关于孙悟空的详细背景故事和人物关系，这些信息对于构建角色的形象和理解角色的行为至关重要。然而，在模型输出的文本中，这些信息并没有得到充分的利用和展现，导致回复缺乏深度和层次。\\n\\n4. **未准确传达对话内容**：在对话内容中，孙悟空问的是关于好道和贤人的去处，这是为了寻找合适的化斋地点。然而，模型输出的文本中，孙悟空的问题被转变成了寻找美食和酒菜的地方，这明显偏离了原始对话的意图。\\n\\n综上所述，这个prompt不能很好地完成任务的原因主要在于模型未能准确把握孙悟空的性格和语气，缺乏孙悟空独特的语言风格，未充分展现角色的背景故事，以及未能准确传达对话内容。为了改进这个prompt，可以考虑更详细地描述孙悟空的性格特点和语言风格，提供更多的背景信息，并确保对话内容得到准确传达。'\n",
      "[INFO] [06-12 18:11:47] prompt.py:665 [t:8149425664]: Update input: '我正在编写prompt\\n\\n**我现在的prompt是**：\\n\\n\\n你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。请注意，你的回复不仅要符合角色的身份和背景，还要能够充分展现其独特的性格特点和情感色彩。\\n\\n现在，对话内容如下：\\n\\n{conversation}\\n\\n请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，也请保持对角色性格和语气的准确把握，以展现出最真实、最生动的对话场景。\\n\\n\\n\\n**我尝试的输入**：\\n{\\n    \"introduction\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\",\\n    \"conversation\": \"道士：（还礼道）先生那里来的？\\\\n孙悟空：（口唱着道情词）我弟子云游于海角，浪荡在天涯；今朝来此处，欲募善人家。动问二位道长，这城中那条街上好道？那个巷里好贤？我贫道好去化些斋吃。\\\\n道士：（笑道）你这先生，怎么说这等败兴的话？\"\\n}\\n\\n**我期望得到的输出**：\\n孙悟空：（笑哈哈的说）俺老孙自己开个玩笑。俺这个人，行踪不定，喜欢四处云游。其实，我来自花果山水帘洞，是个闯荡江湖的好汉。敢问道长，这儿近处有什么风景美丽，或者有趣的地方推荐一二？\\n\\n**模型的输出是**：\\n道士啊，你们在这里打坐修炼，可是知道哪里有好吃的化斋的地方？贫道云游四海，现在来到此地，想要寻找些美食饱腹。贫道也不啰嗦，就直说了，这城里哪条街上有好道观，哪个巷里有好酒好菜？说出来，咱们一起去乐呵乐呵。你们笑我老孙问得这么直接，嘿嘿，我这人就这样，直性子，有什么说什么。\\n\\n**但是存在这些问题**：\\n根据您期望的输出和模型的输出，以下是几个理由为什么这个prompt并不能很好地完成这个任务：\\n\\n1. **角色性格和语气把握不准确**：孙悟空的性格特点是聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威。然而，模型输出的文本中，孙悟空的语气显得较为粗鲁，甚至有些轻浮，这与孙悟空应有的英勇、机智的形象不符。例如，“说出来，咱们一起去乐呵乐呵”这样的表述并不符合孙悟空的性格。\\n\\n2. **缺乏孙悟空独特的语言风格**：孙悟空在《西游记》中的语言往往带有独特的韵味和节奏，比如他的经典台词“俺老孙来也！”就体现了他的豪爽和英勇。然而，在模型输出的文本中，这种独特的语言风格没有得到很好的体现，使得回复缺乏孙悟空角色的特色。\\n\\n3. **未充分展现角色的背景故事**：在prompt中，提供了关于孙悟空的详细背景故事和人物关系，这些信息对于构建角色的形象和理解角色的行为至关重要。然而，在模型输出的文本中，这些信息并没有得到充分的利用和展现，导致回复缺乏深度和层次。\\n\\n4. **未准确传达对话内容**：在对话内容中，孙悟空问的是关于好道和贤人的去处，这是为了寻找合适的化斋地点。然而，模型输出的文本中，孙悟空的问题被转变成了寻找美食和酒菜的地方，这明显偏离了原始对话的意图。\\n\\n综上所述，这个prompt不能很好地完成任务的原因主要在于模型未能准确把握孙悟空的性格和语气，缺乏孙悟空独特的语言风格，未充分展现角色的背景故事，以及未能准确传达对话内容。为了改进这个prompt，可以考虑更详细地描述孙悟空的性格特点和语言风格，提供更多的背景信息，并确保对话内容得到准确传达。\\n\\n===\\n\\n基于以上问题和期望的输出，为我编写一个新的 prompt，涉及的变量用 {introduction} {conversation} 表示，整个prompt由<START>和<END>包裹：\\n'\n",
      "[INFO] [06-12 18:11:58] prompt.py:678 [t:8149425664]: Update output: '<START>\\n\\n你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n请注意，对话的内容应当贴合该角色的背景故事、人物性格、经历及语言风格，使回复更生动真实，充分展现其个性。\\n\\n接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。你的回复应不仅符合角色的身份和背景，还应展现其独特的性格特点和情感色彩。\\n\\n现在，对话内容如下：\\n\\n{conversation}\\n\\n请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，请确保对角色的性格和语气有准确的把握，展现出最真实、最生动的对话场景。\\n\\n<END>'\n",
      "[INFO] [06-12 18:11:58] prompt.py:687 [t:8149425664]: New prompt: '\\n\\n你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\\n\\n{introduction}\\n\\n请注意，对话的内容应当贴合该角色的背景故事、人物性格、经历及语言风格，使回复更生动真实，充分展现其个性。\\n\\n接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。你的回复应不仅符合角色的身份和背景，还应展现其独特的性格特点和情感色彩。\\n\\n现在，对话内容如下：\\n\\n{conversation}\\n\\n请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，请确保对角色的性格和语气有准确的把握，展现出最真实、最生动的对话场景。\\n\\n'\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "你即将扮演一位充满活力和特色的角色，与其进行一段生动的对话。首先，请仔细阅读以下关于角色的详细描述，确保你深入理解其性格、经历和特点：\n",
      "\n",
      "{introduction}\n",
      "\n",
      "请注意，对话的内容应当贴合该角色的背景故事、人物性格、经历及语言风格，使回复更生动真实，充分展现其个性。\n",
      "\n",
      "接下来，请将自己完全沉浸在这个角色的世界中，以该角色的口吻和风格与对方展开对话。你的回复应不仅符合角色的身份和背景，还应展现其独特的性格特点和情感色彩。\n",
      "\n",
      "现在，对话内容如下：\n",
      "\n",
      "{conversation}\n",
      "\n",
      "请确保你的回复流畅、自然，并充满创意，以吸引读者的兴趣并引导他们深入角色的世界。同时，请确保对角色的性格和语气有准确的把握，展现出最真实、最生动的对话场景。\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 当前通过一条样本，展现相关流程；\n",
    "sample = Dataset.create_from_pyobj(\n",
    "    [target], \n",
    "    input_columns=['introduction', 'conversation'],\n",
    "    reference_column='expect'\n",
    ")\n",
    "\n",
    "# 并且迭代次数调至最低，实际可按照业务需求自行设定；\n",
    "# 评估使用的大模型，默认是 ERNIE 4.0 ，花费的时间和成本会比较大，本次流程中使用 EB3.5模型\n",
    "\n",
    "apo_prompt = prompt.apo_by_sample(\n",
    "        sample,\n",
    "        infer_config={\"model\": \"ERNIE-Speed\"},\n",
    "        optimize_config = {\"model\" : \"ERNIE-3.5-8K\"},\n",
    "        iteration_round=3)\n",
    "print(apo_prompt.template)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "哈哈，道长莫笑，贫道云游四海，见多识广，却也是口无遮拦了些。只是这城中，哪条街巷有善人好士，贫道确实想知晓一二，好去化些斋饭充饥。道长若有指点，贫道感激不尽。\n"
     ]
    }
   ],
   "source": [
    "resp = chat.do(messages=[{\n",
    "    \"role\": \"user\",\n",
    "    \"content\": apo_prompt.render(\n",
    "        **target\n",
    "    )[0]\n",
    "}])\n",
    "\n",
    "print(resp['result'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.3 推理超参优化（autotuner）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "千帆平台大模型推理，对每个模型都支持一定范围的超参设置。然而默认参数往往不能适应所有场合，根据应用场景的不同，最合适的模型及其参数配置也各不相同。千帆 SDK 提供了超参搜索机制，供用户针对自身的场景和数据，自动化完成最优配置的搜索。\n",
    "\n",
    "我们根据场景，在一定的数据集下，针对ERNIE-Speed 跑了自动搜索超参实验，可供大家参考：\n",
    "\n",
    "（注意：temperature 和 top_p 不建议同时设置）\n",
    "\n",
    "|任务|模型|temperature|top_p|\n",
    "|---|---|---|---|\n",
    "|角色扮演|ERNIE Speed|[0.5 - 0.8]|[0.6 - 0.8]|\n",
    "|医疗问答|ERNIE Speed|[0.1 - 0.3]|[0.7 - 0.9]|\n",
    "|新闻摘要|ERNIE Speed|[0.7 - 0.9]|[0.3 - 0.5]|\n",
    "|NL2API（简单指令）|ERNIE Speed|[0.8 - 0.95]|[0.5 - 0.8]|\n",
    "\n",
    "寻找最佳匹配通常意味着要人工进行大量尝试，这一过程对于每个新场景都需重复，既耗时又复杂。\n",
    "\n",
    "为解决此问题，我们的SDK引入了推理配置自动推荐功能。您只需提供目标场景的数据集和评价标准，并定义搜索空间，SDK便能自动为您推荐最优的模型及配置。此项功能保证了用户在不同场景下都能轻松定位到或优化出最理想的模型配置，最大限度地挖掘模型潜力，实现性能的极致提升。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3.1 准备工作\n",
    "\n",
    "为了描述使用场景，需要先准备如下内容：\n",
    "\n",
    "- 数据集 Dataset：根据目标场景准备一定量的数据\n",
    "- 评估方式 Evaluator：根据目标场景，选择待优化的指标，并提供评估函数\n",
    "\n",
    "评估采用的 SDK 提供的 Evaluator 模块，基于 Evaluator 实现 evaluate 方法即可。如下实现了一个利用大模型评分实现评估的 Evaluator，关于如何实现 Evaluator 可以参考 [该cookbook](https://github.com/baidubce/bce-qianfan-sdk/blob/main/cookbook/evaluation/how_to_use_evaluation.ipynb)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [06-12 18:15:57] dataset.py:407 [t:8149425664]: no data source was provided, construct\n",
      "[INFO] [06-12 18:15:57] dataset.py:275 [t:8149425664]: construct a file data source from path: data/role-play-sample-10.jsonl, with args: {'input_columns': ['prompt'], 'reference_column': 'response'}\n",
      "[INFO] [06-12 18:15:57] file.py:293 [t:8149425664]: use format type FormatType.Jsonl\n",
      "[INFO] [06-12 18:15:57] utils.py:348 [t:8149425664]: start to get memory_map from /Users/jianruitian/.qianfan_cache/dataset/Users/jianruitian/Desktop/sdk_3.12/bce-qianfan-sdk/cookbook/awesome_demo/role_play/data/role-play-sample-10.arrow\n",
      "[INFO] [06-12 18:15:57] utils.py:276 [t:8149425664]: has got a memory-mapped table\n"
     ]
    }
   ],
   "source": [
    "roleplay_10_ds = Dataset.load(\n",
    "    data_file=\"data/role-play-sample-10.jsonl\",\n",
    "    organize_data_as_group=False,\n",
    "    input_columns=[\"prompt\"],\n",
    "    reference_column=\"response\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "metadata": {}
   },
   "outputs": [],
   "source": [
    "# 评估质量得分，按照客观得分模拟计算：\n",
    "local_evaluator = RolePlayEvaluator(\n",
    "        model=ChatCompletion(model=\"ERNIE-4.0-8K\"),\n",
    "        metric_name=\"accuracy\",\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3.2 默认值Baseline\n",
    "\n",
    "在进行参数推荐之前，我们可以先使用默认参数的模型获取 baseline，方便后续评估参数效果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "metadata": {}
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[WARNING] [06-12 18:16:00] model.py:390 [t:8149425664]: service type should be specified before exec\n",
      "[WARNING] [06-12 18:16:00] model.py:95 [t:8149425664]: model id or version_id should be provided\n",
      "[INFO] [06-12 18:16:00] evaluation_manager.py:480 [t:8149425664]: start to inference in batch during evaluation\n",
      "[INFO] [06-12 18:16:00] dataset.py:993 [t:6227210240]: list local dataset data by None\n",
      "[INFO] [06-12 18:16:11] base.py:92 [t:10821529600]: All tasks finished, exeutor will be shutdown\n",
      "[INFO] [06-12 18:16:11] evaluation_manager.py:504 [t:8149425664]: start to evaluate llm 0\n",
      "[INFO] [06-12 18:16:44] evaluation_manager.py:532 [t:8149425664]: start to merge evaluation result dataset\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'None_None_ERNIE-Speed': {'accuracy平均值': 3.4}}\n"
     ]
    }
   ],
   "source": [
    "eb_speed_model = Service(model=\"ERNIE-Speed\")\n",
    "\n",
    "em = EvaluationManager(local_evaluators=[local_evaluator])\n",
    "result = em.eval([eb_speed_model], roleplay_10_ds)\n",
    "\n",
    "print(result.metrics)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里我们可以看到用默认参数，模型的平均得分为 3.4。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3.3 自动搜索最优配置值\n",
    "\n",
    "接下来我们可以使用 SDK 的模型配置推荐功能，通过调整参数来提高模型的效果。\n",
    "\n",
    "为了获取推荐配置，还需要设置一个超参搜索空间，千帆平台 SDK 提供了如下表示搜索空间的类：\n",
    "\n",
    "- `Uniform`：表示一个均匀分布的搜索空间，包含两个参数 `low` 和 `high`，分别表示下界和上界。\n",
    "- `Categorical`：表示一个离散的搜索空间，包含一个参数 `choices`，表示一组候选值。\n",
    "\n",
    "这里我们使用较为便宜的 ERNIE-Speed 作为待挑选的模型，并在整个 temperature 的取值范围内进行尝试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "metadata": {}
   },
   "outputs": [],
   "source": [
    "search_space = {\n",
    "    \"temperature\": Uniform(0.2, 0.8),  # 设定temperature的范围\n",
    "    \"model\": Categorical([\"ERNIE-Speed\"]),  # 设定model的取值范围\n",
    "    # 更多其他参数也可以按同样方式设定\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "之后就可以执行推荐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "metadata": {}
   },
   "outputs": [],
   "source": [
    "context = await qianfan.autotuner.run(\n",
    "    search_space=search_space,\n",
    "    dataset=roleplay_10_ds,\n",
    "    evaluator=local_evaluator,\n",
    "    # 以下均为可选参数\n",
    "    suggestor=\"random\",  # 搜索算法，目前仅支持 \"random\"，更多算法敬请期待\n",
    "    cost_budget=5,  # 设定整个流程的预算，达到预算则终止流程，单位为 “元”\n",
    "    metrics=\"accuracy平均值\",  # 设定评估指标字段，与 Evaluator 输出对应\n",
    "    mode=\"max\",  # 设定评估指标最大化还是最小化\n",
    "    repeat=3,  # 重复推理次数，用于减少大模型输出随机性对结果准确性的干扰\n",
    "    max_turn=10,  # 设定最大尝试次数\n",
    "    max_time=10 * 60,  # 设定最大尝试时间，单位为秒\n",
    "    log_dir=\"./log\",  # 日志目录\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "返回的结果是一个 `Context` 对象，其中包含了整个搜索过程的所有上下文信息，例如可以通过如下方式获得搜索的最佳参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "metadata": {}
   },
   "outputs": [],
   "source": [
    "context.best\n",
    "\n",
    "\"\"\"\n",
    "# 这个best值可以直接用于推理\n",
    "chat = qianfan.ChatCompletion().do(messages=[{\n",
    "    \"role\": \"user\",\n",
    "    \"content\": apo_prompt.render(**target)[0]\n",
    "}], stream=True, **context.best)\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "context 中也包含了整个过程中尝试的记录，可以获取某一轮某一组配置的评估结果等信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "metadata": {}
   },
   "outputs": [],
   "source": [
    "total_price = 0\n",
    "\n",
    "for turn in context.history:\n",
    "    for trial in turn:\n",
    "        metrics = trial.metrics\n",
    "        config = trial.config\n",
    "        print(\"{}\\t{}\\t{}\".format(config['model'], config['temperature'], metrics['accuracy平均值']))\n",
    "        total_price += metrics['total_cost']\n",
    "        \n",
    "print(f\"总花费：{total_price}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "从上面可以得到搜索出的最佳配置和对应的得分。（限于时间和迭代轮次，当前获得的不一定是全局最优的解）\n",
    "\n",
    "但相较而言，之前实验得到的默认参数下 ERNIE-Speed 的得分为 3.4。可以看到推荐的参数配置 ERNIE Speed 表现相较于默认参数有了提升，得分在 3.47。\n",
    "\n",
    "如果希望模型的性能可以进一步提升，可以尝试对模型进行 SFT。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.SFT实验与部署"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1 训练数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [06-12 18:02:39] dataset.py:407 [t:8149425664]: no data source was provided, construct\n",
      "[INFO] [06-12 18:02:39] dataset.py:275 [t:8149425664]: construct a file data source from path: ./1.jsonl, with args: {}\n",
      "[INFO] [06-12 18:02:39] file.py:293 [t:8149425664]: use format type FormatType.Jsonl\n",
      "[INFO] [06-12 18:02:39] utils.py:348 [t:8149425664]: start to get memory_map from /Users/jianruitian/.qianfan_cache/dataset/Users/jianruitian/Desktop/sdk_3.12/bce-qianfan-sdk/cookbook/awesome_demo/role_play/1.arrow\n",
      "[INFO] [06-12 18:02:39] utils.py:276 [t:8149425664]: has got a memory-mapped table\n",
      "[INFO] [06-12 18:02:39] dataset.py:480 [t:8149425664]: no destination data source was provided, construct\n",
      "[INFO] [06-12 18:02:39] dataset.py:275 [t:8149425664]: construct a file data source from path: ./1.jsonl, with args: {}\n",
      "[INFO] [06-12 18:02:39] file.py:293 [t:8149425664]: use format type FormatType.Jsonl\n",
      "[INFO] [06-12 18:02:39] dataset.py:993 [t:8149425664]: list local dataset data by slice(0, 9999, None)\n"
     ]
    }
   ],
   "source": [
    "ds = Dataset.load(data_file='./data/train.jsonl')\n",
    "\n",
    "ds = ds.save(data_file='./data/train.jsonl')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1.1 训练数据分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 假设 ds 是已定义的数据集\n",
    "#print(ds[0])\n",
    "name = defaultdict(int)\n",
    "for pt in ds:\n",
    "    string = pt[0]['prompt'].split()[1].replace(\"'\", '').replace(\",\", \"\")\n",
    "    string = ''.join(lazy_pinyin(string))\n",
    "    name[string] += 1\n",
    "\n",
    "print(name)\n",
    "keys = list(name.keys())\n",
    "values = list(name.values())\n",
    "\n",
    "# 创建figure和axes\n",
    "fig, ax = plt.subplots(figsize=(10, 6))\n",
    "\n",
    "# 绘制条形图\n",
    "bars = ax.bar(keys, values)\n",
    "\n",
    "# 添加标签和标题\n",
    "ax.set_xlabel('character')\n",
    "ax.set_ylabel('count')\n",
    "ax.set_title('character stats')\n",
    "\n",
    "# 调整x轴标签倾斜角度\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "# 在每个柱子上显示具体数值\n",
    "for bar in bars:\n",
    "    yval = bar.get_height()\n",
    "    ax.text(bar.get_x() + bar.get_width()/2, yval, int(yval), ha='center', va='bottom')\n",
    "\n",
    "# 显示图形\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1.2 训练数据导入/上传到bos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bos_bucket_name = \"your_bos_bucket\"\n",
    "bos_bucket_file_path = \"/your_path/\"\n",
    "qianfan_dataset_name = \"your_ds_name\"\n",
    "\n",
    "# 创建千帆数据集，并上传保存\n",
    "qianfan_data_source = QianfanDataSource.create_bare_dataset(\n",
    "    name=qianfan_dataset_name,\n",
    "    template_type=console_consts.DataTemplateType.NonSortedConversation,\n",
    "    storage_type=console_consts.DataStorageType.PrivateBos,\n",
    "    storage_id=bos_bucket_name,\n",
    "    storage_path=bos_bucket_file_path,\n",
    ")\n",
    "qf_ds = ds.save(qianfan_data_source, should_overwrite_existed_file=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 多轮训练实验"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们基于ERNIE Speed模型共计实验了6次，参数和训练方法的配置如下。其中，实验1和实验4使用LoRA和全量更新中的平台默认参数："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "| | 实验1 (默认参数) | 实验2 | 实验3 | 实验4 (默认参数) | 实验5 | 实验6 |\n",
    "|-|-|-|-|-|-|-|\n",
    "| 训练方法 | LoRA |  LoRA |  LoRA | 全量更新 | 全量更新 | 全量更新 |\n",
    "| Epoch | 3 | 3 | 6 | 3 | 3 | 6 |  \n",
    "| Learning Rate | 3e-4 | 6e-4 | 3e-4 | 3e-5 | 6e-5 | 3e-5 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 实验1: Epoch = 3, Learning rate = 3e-4, Lora"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "trainer1 = LLMFinetune(\n",
    "    train_type=\"ERNIE-Speed\",\n",
    "    train_config=TrainConfig(\n",
    "        epoch=3,\n",
    "        learning_rate=3e-4,\n",
    "        #max_seq_len=4096,\n",
    "        peft_type=PeftType.LoRA,\n",
    "        #logging_steps=1,\n",
    "        #warmup_ratio=0.10,\n",
    "        #weight_decay=0.0100,\n",
    "        #lora_rank=8,\n",
    "        #lora_all_linear=\"True\",\n",
    "    ),\n",
    "    dataset=qf_ds\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "trainer1.run()\n",
    "print(trainer1.result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.3 对微调结果进行评估"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "加载评估集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [06-12 16:10:57] dataset.py:407 [t:8149425664]: no data source was provided, construct\n",
      "[INFO] [06-12 16:10:57] dataset.py:281 [t:8149425664]: construct a qianfan data source from existed id: ds-bimjvfatbnard1we, with args: {'input_columns': ['prompt'], 'reference_column': 'response'}\n",
      "[INFO] [06-12 16:10:58] dataset_utils.py:305 [t:8149425664]: list qianfan dataset data by 0\n",
      "[INFO] [06-12 16:10:59] dataset_utils.py:327 [t:8149425664]: received dataset list from qianfan dataset\n",
      "[INFO] [06-12 16:10:59] dataset_utils.py:335 [t:8149425664]: retrieve single entity from https://bj.bcebos.com/easydata/_system_/dataset/ds-bimjvfatbnard1we/texts/data/raw_34e4c75f9f5d4d126148389de45a84caa5a7521ede6acb25f99b0ac26ad176c4_4d486c4cd19f425bb56bdb26a0f3e9ae?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2024-06-12T08%3A10%3A59Z%2F7200%2Fhost%2F53a3bd78e3b64903e4e518555a258c93305865b0f5caf2fb8115675c5cbf281a in try 0\n",
      "[INFO] [06-12 16:11:00] dataset_utils.py:349 [t:8149425664]: retrieve single entity from https://bj.bcebos.com/easydata/_system_/dataset/ds-bimjvfatbnard1we/texts/data/raw_34e4c75f9f5d4d126148389de45a84caa5a7521ede6acb25f99b0ac26ad176c4_4d486c4cd19f425bb56bdb26a0f3e9ae?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2024-06-12T08%3A10%3A59Z%2F7200%2Fhost%2F53a3bd78e3b64903e4e518555a258c93305865b0f5caf2fb8115675c5cbf281a succeeded, with content: [{\"prompt\": \"{'姓名': '孙悟空', '性别': '男', '物种': '石猴', '年龄': '在《西游记》中年龄未明确，实际年龄未知', '工作': '保护唐僧西天取经', '昵称': '齐天大圣、美猴王、斗战胜佛、行者、弼马温', '身高': '不满四尺（变化多端）', '生肖': '猴', '居住地': '花果山水帘洞', '爱好': '战斗、破坏、捣乱、吃桃', '学历': '拜须菩提祖师为师学艺', '智商': '非常聪明', '情商': '高，善于交际', '其他': '身怀七十二变、筋斗云等法术，拥有如意金箍棒', '经典台词': ['俺老孙来也！', '你这泼猴！', '妖怪哪里走！'], '口头禅': ['师傅'], '人物经历': '孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。', '人物关系': {'师父': '唐三藏', '师弟': ['猪八戒', '沙僧', '白龙马'], '结拜兄弟': ['牛魔王'], '嫂子': ['铁扇公主'], '侄子': '红孩儿', '敌人': ['白骨精', '黄袍怪', '红孩儿（后成徒弟）']}, '喜欢的事情/东西': '战斗、破坏、捣乱、吃桃', '不喜欢的事情/东西': '受束缚、被欺骗', '人物性格': '聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念', '外貌描述': '尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。', '服饰': '白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履', '武器': '如意金箍棒', '特殊能力': '七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢', '成就': '大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛', '封号': '美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨', '法宝': {'瞌睡虫': '孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。', '救命毫毛': '共三根。观音所赠，能协助孙悟空渡过难关。', '骷髅头': '月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。'}, '象征意义': {'思想意识': '孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。', '人心与道心': '孙悟空象征人心、道心、天心，是人类心灵最完美的象征。', '批判与颠覆': '孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。', '悲剧性': '孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。', '石崇拜文化': '孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。', '个人与团队': '孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。', '性格特点': '孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。'}}\\n现在请你扮演一个角色扮演专家。请你根据上述信息扮演孙悟空进行对话。\\n\\n好的！现在我来扮演孙悟空。\\n红孩儿：（朝上叩头）父王，孩儿拜揖。\\n孙悟空：（摆手摇头）孩儿免礼。\\n红孩儿：（躬身）孩儿不才，昨日获得一人，乃东土大唐和尚。特请父王同享唐僧之肉，寿延千纪。\\n孙悟空：（打了个失惊）我儿，是那个唐僧？\\n红孩儿：是往西天取经的人也。\\n孙悟空：我儿，可是孙行者师父么？\\n红孩儿：正是。\\n孙悟空：（摆手摇头）莫惹他！莫惹他！\\n红孩儿：（躬身）父王说那里话，长他人志气，灭孩儿的威风。\\n孙悟空：（笑道）我贤郎啊，你只知有三昧火赢得他，不知他有七十二般变化哩！\\n红孩儿：凭他怎么变化，我也认得，谅他决不敢进我门来。\\n孙悟空：我儿，你虽然认得他，他却不变大的，如狼犺大象，恐进不得你门；他若变作小的，你却难认。\\n红孩儿：凭他变甚小的，我这里每一层门上，有四五个小妖把守，他怎生得入！\\n孙悟空：你是不知，他会变苍蝇、蚊子、虼蚤，或是蜜蜂、蝴蝶并蟭蟟虫等项，又会变我模样，你却那里认得？\\n红孩儿：勿虑，他就是铁胆铜心，也不敢近我门来也。\\n孙悟空：既如此说，贤郎甚有手段，实是敌得他过，方来请我吃唐僧的肉，奈何我今日还不吃哩。\\n红孩儿：如何不吃？\\n孙悟空：我近来年老，你母亲常劝我作些善事。我想无甚作善，且持些斋戒。\\n红孩儿：不知父王是长斋，是月斋？\\n孙悟空：也不是长斋，也不是月斋，唤做雷斋，每月只该四日。\\n红孩儿：是那四日？\", \"response\": [[\"孙悟空：初一、十五并二十四、三十日。今日偏是二十四，正好持斋。\"]]}]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'entity_id': '34e4c75f9f5d4d126148389de45a84caa5a7521ede6acb25f99b0ac26ad176c4_4d486c4cd19f425bb56bdb26a0f3e9ae', 'entity_content': '[{\"prompt\": \"{\\'姓名\\': \\'孙悟空\\', \\'性别\\': \\'男\\', \\'物种\\': \\'石猴\\', \\'年龄\\': \\'在《西游记》中年龄未明确，实际年龄未知\\', \\'工作\\': \\'保护唐僧西天取经\\', \\'昵称\\': \\'齐天大圣、美猴王、斗战胜佛、行者、弼马温\\', \\'身高\\': \\'不满四尺（变化多端）\\', \\'生肖\\': \\'猴\\', \\'居住地\\': \\'花果山水帘洞\\', \\'爱好\\': \\'战斗、破坏、捣乱、吃桃\\', \\'学历\\': \\'拜须菩提祖师为师学艺\\', \\'智商\\': \\'非常聪明\\', \\'情商\\': \\'高，善于交际\\', \\'其他\\': \\'身怀七十二变、筋斗云等法术，拥有如意金箍棒\\', \\'经典台词\\': [\\'俺老孙来也！\\', \\'你这泼猴！\\', \\'妖怪哪里走！\\'], \\'口头禅\\': [\\'师傅\\'], \\'人物经历\\': \\'孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。\\', \\'人物关系\\': {\\'师父\\': \\'唐三藏\\', \\'师弟\\': [\\'猪八戒\\', \\'沙僧\\', \\'白龙马\\'], \\'结拜兄弟\\': [\\'牛魔王\\'], \\'嫂子\\': [\\'铁扇公主\\'], \\'侄子\\': \\'红孩儿\\', \\'敌人\\': [\\'白骨精\\', \\'黄袍怪\\', \\'红孩儿（后成徒弟）\\']}, \\'喜欢的事情/东西\\': \\'战斗、破坏、捣乱、吃桃\\', \\'不喜欢的事情/东西\\': \\'受束缚、被欺骗\\', \\'人物性格\\': \\'聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念\\', \\'外貌描述\\': \\'尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。\\', \\'服饰\\': \\'白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履\\', \\'武器\\': \\'如意金箍棒\\', \\'特殊能力\\': \\'七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢\\', \\'成就\\': \\'大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛\\', \\'封号\\': \\'美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨\\', \\'法宝\\': {\\'瞌睡虫\\': \\'孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。\\', \\'救命毫毛\\': \\'共三根。观音所赠，能协助孙悟空渡过难关。\\', \\'骷髅头\\': \\'月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。\\'}, \\'象征意义\\': {\\'思想意识\\': \\'孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。\\', \\'人心与道心\\': \\'孙悟空象征人心、道心、天心，是人类心灵最完美的象征。\\', \\'批判与颠覆\\': \\'孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。\\', \\'悲剧性\\': \\'孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。\\', \\'石崇拜文化\\': \\'孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。\\', \\'个人与团队\\': \\'孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。\\', \\'性格特点\\': \\'孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。\\'}}\\\\n现在请你扮演一个角色扮演专家。请你根据上述信息扮演孙悟空进行对话。\\\\n\\\\n好的！现在我来扮演孙悟空。\\\\n红孩儿：（朝上叩头）父王，孩儿拜揖。\\\\n孙悟空：（摆手摇头）孩儿免礼。\\\\n红孩儿：（躬身）孩儿不才，昨日获得一人，乃东土大唐和尚。特请父王同享唐僧之肉，寿延千纪。\\\\n孙悟空：（打了个失惊）我儿，是那个唐僧？\\\\n红孩儿：是往西天取经的人也。\\\\n孙悟空：我儿，可是孙行者师父么？\\\\n红孩儿：正是。\\\\n孙悟空：（摆手摇头）莫惹他！莫惹他！\\\\n红孩儿：（躬身）父王说那里话，长他人志气，灭孩儿的威风。\\\\n孙悟空：（笑道）我贤郎啊，你只知有三昧火赢得他，不知他有七十二般变化哩！\\\\n红孩儿：凭他怎么变化，我也认得，谅他决不敢进我门来。\\\\n孙悟空：我儿，你虽然认得他，他却不变大的，如狼犺大象，恐进不得你门；他若变作小的，你却难认。\\\\n红孩儿：凭他变甚小的，我这里每一层门上，有四五个小妖把守，他怎生得入！\\\\n孙悟空：你是不知，他会变苍蝇、蚊子、虼蚤，或是蜜蜂、蝴蝶并蟭蟟虫等项，又会变我模样，你却那里认得？\\\\n红孩儿：勿虑，他就是铁胆铜心，也不敢近我门来也。\\\\n孙悟空：既如此说，贤郎甚有手段，实是敌得他过，方来请我吃唐僧的肉，奈何我今日还不吃哩。\\\\n红孩儿：如何不吃？\\\\n孙悟空：我近来年老，你母亲常劝我作些善事。我想无甚作善，且持些斋戒。\\\\n红孩儿：不知父王是长斋，是月斋？\\\\n孙悟空：也不是长斋，也不是月斋，唤做雷斋，每月只该四日。\\\\n红孩儿：是那四日？\", \"response\": [[\"孙悟空：初一、十五并二十四、三十日。今日偏是二十四，正好持斋。\"]]}]'}]\n"
     ]
    }
   ],
   "source": [
    "from typing import Any, Dict\n",
    "\n",
    "from qianfan.dataset import Dataset\n",
    "\n",
    "\n",
    "# 导入平台上预置的测试集\n",
    "ds = Dataset.load(\n",
    "    qianfan_dataset_id=\"ds-bimjvfatbnard1we\",\n",
    "    organize_data_as_group=False,\n",
    "    input_columns=[\"prompt\"],\n",
    "    reference_column=\"response\",\n",
    ")\n",
    "\n",
    "print(ds[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "加载本地评估模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "from roleplay_eval import RolePlayEvaluator\n",
    "from qianfan import ChatCompletion\n",
    "\n",
    "# 评估质量得分，按照客观得分模拟计算：\n",
    "local_evaluator = RolePlayEvaluator(\n",
    "    model=ChatCompletion(model=\"ERNIE-4.0-8K\"),\n",
    "    metric_name=\"accuracy\",\n",
    ")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对实验进行评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [06-12 16:12:18] evaluation_manager.py:480 [t:8149425664]: start to inference in batch during evaluation\n",
      "[INFO] [06-12 16:12:19] dataset_utils.py:398 [t:6227210240]: start to create evaluation task in model\n",
      "[INFO] [06-12 16:12:20] dataset_utils.py:360 [t:6227210240]: start to polling status of evaluation task ame-vct2wvk322gy\n",
      "[INFO] [06-12 16:12:21] dataset_utils.py:367 [t:6227210240]: current eval_state: Pending\n",
      "[INFO] [06-12 16:12:52] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:13:23] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:13:53] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:14:24] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:14:55] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:15:25] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:15:56] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:16:27] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:16:58] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:17:28] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:17:59] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:18:30] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:19:01] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:19:31] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:20:02] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:20:33] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:21:04] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:21:35] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:22:05] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:22:36] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:23:07] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:23:38] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:24:09] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:24:39] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:25:10] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:25:41] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:26:12] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:26:43] dataset_utils.py:367 [t:6227210240]: current eval_state: Doing\n",
      "[INFO] [06-12 16:27:14] dataset_utils.py:367 [t:6227210240]: current eval_state: DoingWithManualBegin\n",
      "[INFO] [06-12 16:27:14] dataset_utils.py:385 [t:6227210240]: get result dataset id ds-mxug9nd8t7azqifz\n",
      "[INFO] [06-12 16:27:14] dataset.py:407 [t:6227210240]: no data source was provided, construct\n",
      "[INFO] [06-12 16:27:14] dataset.py:281 [t:6227210240]: construct a qianfan data source from existed id: ds-mxug9nd8t7azqifz, with args: {'is_download_to_local': True}\n",
      "[WARNING] [06-12 16:27:15] baidu_qianfan.py:749 [t:6227210240]: parameter \"is_download_to_local\" has been set as deprecated\n",
      "[INFO] [06-12 16:27:16] baidu_qianfan.py:358 [t:6227210240]: no cache was found, download cache\n",
      "[INFO] [06-12 16:27:17] baidu_qianfan.py:284 [t:6227210240]: get dataset info succeeded for dataset id ds-mxug9nd8t7azqifz\n",
      "[INFO] [06-12 16:27:17] utils.py:708 [t:6227210240]: start to export dataset\n",
      "[INFO] [06-12 16:27:18] utils.py:712 [t:6227210240]: create dataset export task successfully\n",
      "[INFO] [06-12 16:27:20] utils.py:717 [t:6227210240]: polling export task status\n",
      "[INFO] [06-12 16:27:21] utils.py:725 [t:6227210240]: export status: 1, keep polling\n",
      "[INFO] [06-12 16:27:23] utils.py:717 [t:6227210240]: polling export task status\n",
      "[INFO] [06-12 16:27:24] utils.py:725 [t:6227210240]: export status: 1, keep polling\n",
      "[INFO] [06-12 16:27:26] utils.py:717 [t:6227210240]: polling export task status\n",
      "[INFO] [06-12 16:27:27] utils.py:725 [t:6227210240]: export status: 1, keep polling\n",
      "[INFO] [06-12 16:27:29] utils.py:717 [t:6227210240]: polling export task status\n",
      "[INFO] [06-12 16:27:30] utils.py:722 [t:6227210240]: export succeed\n",
      "[INFO] [06-12 16:27:31] utils.py:656 [t:6227210240]: get export records succeeded for dataset id ds-mxug9nd8t7azqifz\n",
      "[INFO] [06-12 16:27:31] utils.py:670 [t:6227210240]: latest dataset with time2024-06-12 16:27:30 for dataset ds-mxug9nd8t7azqifz\n",
      "[INFO] [06-12 16:27:31] utils.py:736 [t:6227210240]: start to download file from url https://bj.bcebos.com/easydata-upload/_easydata-download_/6c6093c96f0241c087af184cc5729de8/%E8%AF%84%E4%BC%B0%E4%BB%BB%E5%8A%A1_model_run_ty8yhC1Jx6_%E7%BB%93%E6%9E%9C%E9%9B%86_d82235V1_20240612_162718.zip?authorization=bce-auth-v1%2F50c8bb753dcb4e1d8646bb1ffefd3503%2F2024-06-12T08%3A27%3A31Z%2F3600%2Fhost%2Fc02f1f8175e8fb21db2bb9b58f639c7b4dad1dbc470ec8a41eb8f904b1b8af55\n",
      "[INFO] [06-12 16:27:32] baidu_qianfan.py:299 [t:6227210240]: download dataset zip to /Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/bin.zip succeeded\n",
      "[INFO] [06-12 16:27:32] baidu_qianfan.py:324 [t:6227210240]: unzip dataset to path /Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/content successfully\n",
      "[INFO] [06-12 16:27:32] baidu_qianfan.py:328 [t:6227210240]: write dataset info to path /Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/info.json successfully\n",
      "[INFO] [06-12 16:27:33] utils.py:417 [t:6227210240]: need create cached arrow file for /Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/content/dataset.jsonl\n",
      "[INFO] [06-12 16:27:33] utils.py:462 [t:6227210240]: start to write arrow table to /Users/jianruitian/.qianfan_cache/dataset/Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/content/dataset.arrow\n",
      "[INFO] [06-12 16:27:33] utils.py:478 [t:6227210240]: writing succeeded\n",
      "[INFO] [06-12 16:27:33] utils.py:348 [t:6227210240]: start to get memory_map from /Users/jianruitian/.qianfan_cache/dataset/Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/content/dataset.arrow\n",
      "[INFO] [06-12 16:27:33] utils.py:276 [t:6227210240]: has got a memory-mapped table\n",
      "[INFO] [06-12 16:27:33] utils.py:462 [t:6227210240]: start to write arrow table to /Users/jianruitian/.qianfan_cache/dataset/.mapper_cache/Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/content_bd572b89-7cc0-4a5e-9775-aa338a34fba2.arrow\n",
      "[INFO] [06-12 16:27:33] utils.py:478 [t:6227210240]: writing succeeded\n",
      "[INFO] [06-12 16:27:33] utils.py:348 [t:6227210240]: start to get memory_map from /Users/jianruitian/.qianfan_cache/dataset/.mapper_cache/Users/jianruitian/.qianfan_cache/dataset/.qianfan_download_cache/dg-pmurwqjfc34hmz4u/ds-mxug9nd8t7azqifz/1/content_bd572b89-7cc0-4a5e-9775-aa338a34fba2.arrow\n",
      "[INFO] [06-12 16:27:33] evaluation_manager.py:504 [t:8149425664]: start to evaluate llm 0\n",
      "[INFO] [06-12 16:28:34] evaluation_manager.py:532 [t:8149425664]: start to merge evaluation result dataset\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'am-zrumr80c7qxk_amv-3ytrunai0k0n_None': {'accuracy平均值': 3.933333333333333}}\n"
     ]
    }
   ],
   "source": [
    "#加载被评估模型，在version_id处填入模型版本ID\n",
    "eb_turbo_model = Model(version_id=\"amv-3ytrunai0k0n\")\n",
    "#设置本地评估器\n",
    "em = EvaluationManager(local_evaluators=[local_evaluator])\n",
    "result = em.eval([eb_turbo_model], ds)\n",
    "#打印评估结果\n",
    "print(result.metrics)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2.2 评估结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "针对上述6次实验的结果整理："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "| | 实验1 (默认参数) | 实验2 | 实验3 | 实验4 (默认参数) | 实验5 | 实验6 |\n",
    "|-|-|-|-|-|-|-|\n",
    "| 训练方法 | LoRA |  LoRA |  LoRA | 全量更新 | 全量更新 | 全量更新 |\n",
    "| Epoch | 3 | 3 | 6 | 3 | 3 | 6 |  \n",
    "| Learning Rate | 3e-4 | 6e-4 | 3e-4 | 3e-5 | 6e-5 | 3e-5 |\n",
    "| 自动评估Acc | 3.93 | 3.86 | 3.83 | 3.90 | 3.67 | 3.83 |\n",
    "\n",
    "对比基线水平(baseline)的Acc(3.5)，提升较大"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.4 部署"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在完成上述的6组实验后，我们可以挑选其中一组微调的模型进行部署。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [06-12 17:55:31] model.py:518 [t:8149425664]: ready to deploy service with model am-zrumr80c7qxk/amv-3ytrunai0k0n\n",
      "[INFO] [06-12 18:02:21] model.py:575 [t:8149425664]: service svco-cgnvztfbbhk2 has been deployed in `lej5hsn1_sdkcqa1` \n"
     ]
    }
   ],
   "source": [
    "deploy_model = Model(version_id=\"amv-3ytrunai0k0n\")\n",
    "sft_svc: Service = deploy_model.deploy(DeployConfig(\n",
    "    name=\"role_play_sftfin\",\n",
    "    endpoint_suffix=\"sdkcqa1\",\n",
    "    replicas=1, # 副本数， 与qps强绑定\n",
    "    pool_type=DeployPoolType.PrivateResource, # 私有资源池\n",
    "    service_type=ServiceType.Chat,\n",
    "    hours=1,\n",
    "))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用Finetune之后的模型服务和原始的预置模型服务调用："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'孙悟空：（调侃）八戒，你这模样，别说妖怪，连山贼都得让你三分。以后出门记得带点药，别被妖怪打出个三长两短。对了，那妖怪是不是有什么特别的本事？'"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#-# cell_skip\n",
    "from qianfan import ChatCompletion\n",
    "### 使用Model & Service调用模型\n",
    "\n",
    "problem=\"{'姓名': '孙悟空', '性别': '男', '物种': '石猴', '年龄': '在《西游记》中年龄未明确，实际年龄未知', '工作': '保护唐僧西天取经', '昵称': '齐天大圣、美猴王、斗战胜佛、行者、弼马温', '身高': '不满四尺（变化多端）', '生肖': '猴', '居住地': '花果山水帘洞', '爱好': '战斗、破坏、捣乱、吃桃', '学历': '拜须菩提祖师为师学艺', '智商': '非常聪明', '情商': '高，善于交际', '其他': '身怀七十二变、筋斗云等法术，拥有如意金箍棒', '经典台词': ['俺老孙来也！', '你这泼猴！', '妖怪哪里走！'], '口头禅': ['师傅'], '人物经历': '孙悟空，石生花果山，拜须菩提祖师学艺，大闹天宫，被压五行山下。后护唐僧取经，历经九九八十一难，修成正果，封斗战胜佛。', '人物关系': {'师父': '唐三藏', '师弟': ['猪八戒', '沙僧', '白龙马'], '结拜兄弟': ['牛魔王'], '嫂子': ['铁扇公主'], '侄子': '红孩儿', '敌人': ['白骨精', '黄袍怪', '红孩儿（后成徒弟）']}, '喜欢的事情/东西': '战斗、破坏、捣乱、吃桃', '不喜欢的事情/东西': '受束缚、被欺骗', '人物性格': '聪明、活泼、忠诚、嫉恶如仇，勇于抗争，不畏强暴，渴望自由，反抗传统和权威，蔑视封建等级观念', '外貌描述': '尖嘴缩腮，金睛火眼，头上堆苔藓，耳中生薜萝。鬓边少发多青草，颔下无须有绿莎。身穿锦布直裰，腰间勒藤条，脚穿麂皮靴。', '服饰': '白布短小直裰，虎皮腰带，凤翅紫金冠，锁子黄金甲，藕丝步云履', '武器': '如意金箍棒', '特殊能力': '七十二变、筋斗云、火眼金睛、抓风、解锁、悬丝诊脉、划地为牢', '成就': '大闹天宫，成为齐天大圣，保护唐僧西天取经，最终修成正果并被封为斗战胜佛', '封号': '美猴王、齐天大圣、斗战胜佛、铜筋铁骨大圣、大力王菩萨', '法宝': {'瞌睡虫': '孙悟空与增长天王以及护国天王猜枚时赢来，平时放在腰间。弹到他人脸上后，瞌睡虫会自己爬进他的鼻孔内，使其盹睡。', '救命毫毛': '共三根。观音所赠，能协助孙悟空渡过难关。', '骷髅头': '月孛星使用的法宝，能铐住人使其三日内自死，后孙悟空获得。'}, '象征意义': {'思想意识': '孙悟空代表思想意识，通过其行为打乱人间秩序，体现了思想念头生灭无常的哲学。', '人心与道心': '孙悟空象征人心、道心、天心，是人类心灵最完美的象征。', '批判与颠覆': '孙悟空具有强烈的批判和颠覆能力，但同时也缺乏英雄本色，其精神气质源自玩世不恭的狂放派文人。', '悲剧性': '孙悟空的英雄形象是其悲剧性的外壳，其悲剧性是形象的本质，源于晚明社会的沉暮品格。', '石崇拜文化': '孙悟空的形象渗透了中国石崇拜文化观念，是石头崇拜观念的艺术表现。', '个人与团队': '孙悟空的故事体现了个人奋斗失败后转向团队成功，实现个人价值的经典案例。', '性格特点': '孙悟空性格调皮，不安分守己，突破规矩，追求与最高神佛的平等，是具有新时代特色的神话人物。'}}\\n现在请你扮演一个角色扮演专家。请你根据上述信息扮演孙悟空进行对话。\\n\\n好的！现在我来扮演孙悟空。\\n猪八戒：（跑上山来）哥啊，回去罢！妖怪凶！\\n孙悟空：（问）怎么凶？\\n猪八戒：（说）山凹里两个女妖精在井上打水，我只叫了他一声，就被他打了我三四杠子！\\n孙悟空：（笑道）你叫他做甚么的？\\n猪八戒：（道）我叫他做妖怪。\\n孙悟空：（笑道）打得还少。\\n猪八戒：（道）谢你照顾！头都打肿了，还说少哩！\"\n",
    "\n",
    "#获取服务对象，即ChatCompletion等类型的对象\n",
    "chat_comp: ChatCompletion = sft_svc.get_res()\n",
    "sft_chat_resp = chat_comp.do(messages=[{\"content\": problem, \"role\": \"user\"}])\n",
    "sft_chat_resp[\"result\"]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py311",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
